home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 001a / filesnip.zip / FILESNIP.ASM < prev    next >
Assembly Source File  |  1990-07-14  |  43KB  |  1,476 lines

  1. page 60,132
  2. MASM
  3. ; This is a modification of the programme described below (SNIPPER).
  4. ; 0.0.1    gets all chars on lines between point 1 and point 2
  5. ; 0.0.2    allows the use of HOME and END keys to move around the screen.
  6. ; 0.0.3    allows hitting ESC key in filename prompt for entering
  7. ;    completely new file name.
  8. ; 0.0.4    fixed bug in ESC key during filename entry.  If esc hit and
  9. ;    then return, will exit without saving to file.  if ESC hit
  10. ;    then chars entered for new filename, will print to file. 
  11. ; 0.0.5    added new option when writing to file.  Entering F will now
  12. ;    strip out all multiple spaces and any pipes, as well as will
  13. ;    put 2 spaces after any punctuation.  Old write to file
  14. ;    (unformatted) is now option "U"
  15. ; 0.0.6    fixed problem with help box not displaying all options and
  16. ;    correctly formatting the box.
  17. ; 0.0.7    fixed help box display so that it is uses it's own character 
  18. ;    attributes, and restores original attribute upon exit.
  19. ; 0.0.8    Added colour to Help Box.  Unsure if will work with mono
  20. ; 0.0.9    gets filename from first 8 chars or from first char to period, 
  21. ;    of first line of highlight, + .RTT.   Refuses all chars which
  22. ;    filenames can not contain.
  23. ; 0.1.0    checks for mono display adapter.  if present, displays mono
  24. ;    help.
  25. ; 0.1.1    Modified display of copyright notice.
  26. ; 0.1.2 Added use of INS key when moving to top_left position.  Hitting
  27. ;    INS will move the cursor to the 34th column, which is the
  28. ;    standard starting space for file descriptions on PCB/ProDoor BBSs
  29. ; 0.1.3    Fixed problem with getting filename, and hitting ESC.  Now
  30. ;    resets filechar flag so that if used again after hitting esc, 
  31. ;    or entering a new filename, will now find new filename.  
  32. ;    Also, fills out full space for filename with 0H after each
  33. ;    filename.  Previously, if the new filename was shorter than
  34. ;    the last one entered, there would be residual chars.
  35. ; 0.1.4    Fixed problem with underscore as part of a filename.  Had
  36. ;    accidently included it in the list of chars not acceptable.
  37. ; 0.1.5    Fixed highlighting problem associated with reading filenames
  38. ;    of 8 chars + ext.
  39. ; 0.1.6    Program sends "fl filename.ext" to keyboard buffer, for file 
  40. ;    flagging on BBS.
  41. ; 0.1.7 Pruned program of unused or unnecessary functions relating to
  42. ;    SNIPPER
  43. ; 0.1.8    Extended total filename size to a maximum of 50 chars for
  44. ;    large paths.
  45. ; 0.1.9    Fixed problem with using the program multiple
  46. ;    times.  Wouldn't write more than one file nor would it spit
  47. ;    out more then "F" on the second use in the file flag section.
  48. ; 0.2.0    Reduced Maximum filename length to 12 places in anticipation of
  49. ;    the use of a path statement on the command line to be added in
  50. ;    an upcomming version.
  51. ; 0.2.1    Added use of pathname on command line.  Path statement will 
  52. ;    now be /P=path.  Command line must be eithe filesnip by itself
  53. ;    or filesnip rows,cols,/P=path
  54. ; 0.3.0    No modifications - Found no bugs
  55. ; 0.4.0    No modifications - Found no bugs
  56. ; 0.5.0    No modifications - Found no bugs
  57. ; 0.6.0    No modifications - Found no bugs
  58. ; 0.7.0    No modifications - Found no bugs
  59. ; 0.8.0    No modifications - Found no bugs
  60. ; 0.9.0    No modifications - Found no bugs
  61. ; 1.0.0    Initial Release - 6 June 1990
  62. ; 1.0.1 Made use of path statement flag on command line non-case
  63. ;    sensitive.
  64. ; 1.0.2    Added ESC before flagging of file to download in case user is
  65. ;    in scrollback mode.
  66. ; 1.1.0    Added reformatting of captured text to make it look better in
  67. ;    the .RTT file.  Now, no line will be longer than 72 chars,
  68. ;    with text broken at spaces.
  69. ; 1.1.1    Added breaking of lines at all appropriate places, ie: hyphens,
  70. ;    slashes, underscores, plus and equal symbols.  Also fixed bug
  71. ;    which occured if for some unknown reason a captured line had
  72. ;    more than 72 chars in a row (ie. no white spaces)
  73. ; 1.2.0    Removed Printer feature as it was more or less useless.
  74. ; 1.2.1    Got rid of extra carriage return that was placed in .RTT file
  75. ;    at end of text.  Was causing problems with program used to
  76. ;    incorporate files into BBS system.
  77.  
  78.  
  79. ; SNIPPER is a resident utility which allows cutting out a portion
  80. ; of the screen.  The selected portion may be printed, written
  81. ; to disk or entered in the keyboard buffer.  Activate SNIPPER by
  82. ; pressing CTL-~, then position the cursor in the upper left corner of
  83. ; the window using the arrow keys.  Press CR to fix the first corner,
  84. ; then expand the window with arrow keys.  Finally, type "P" to print,
  85. ; "F" for disk file, "G" to retrieve or CR for a help menu.  Press ESC
  86. ; any time to exit SNIPPER.  When installing SNIPPER, use the optional
  87. ; parameters to expand it's internal buffer for displays (such as the
  88. ; EGA) containing more than the standard 25 rows and 80 columns.
  89. ;   SNIPPER  [rows,columns]
  90.  
  91. ;------------------------------------;
  92. ; BIOS_SEG IS THE ROM-BIOS DATA AREA ;
  93. ;------------------------------------;
  94. BIOS_SEG    SEGMENT    AT 0040H
  95.         ORG    004AH
  96. CRT_COLS    DB    ?        ;CURRENT NUMBER OF COLUMNS
  97.         ORG    0050H
  98. CURSOR_POSN    DW    8 DUP(?)    ;CURRENT CURSOR LOCATION
  99.         ORG    0062H
  100. ACTIVE_PAGE    DB    ?        ;ACTIVE PAGE FOR CGA AND EGA
  101.         ORG    0084H
  102. ROWS        DB    ?        ;LAST ROW NUMBER FOR EGA
  103. BIOS_SEG    ENDS
  104.  
  105. CSEG        SEGMENT
  106.         ASSUME    CS:CSEG,DS:NOTHING
  107.         ORG    0100H        ;BEGINNING FOR .COM PROGRAMS
  108. START:        
  109.                 JMP    INITIALIZE    ;INITIALIZATION CODE IS AT END
  110. ;--------------------------------;
  111. ; DATA AREA USED BY THIS PROGRAM ;
  112. ;--------------------------------;
  113. HOTKEY        EQU    29H        ;SCAN CODE FOR "~" KEY
  114. SHIFT_MASK    EQU    00000100B    ;MASK FOR CTL KEY
  115. COPYRIGHT     DB     17 DUP(20H),214,44 DUP(196),183
  116.         DB    13,10,17 DUP(20H),186,44 DUP(20H),186     
  117.         DB    10,13,17 DUP(20H),186," File-SNIP 1.2.1 (c) 1990 Mad Monk Software ",186
  118.         DB    10,13,17 DUP(20H),186,44 DUP(20H),186     
  119.         DB    10,13,17 DUP(20H),186,44 DUP(20H),186     
  120.         DB    10,13,17 DUP(20H),186,7,14 DUP(20H),"Hotkey is CTL-~",7,15 DUP(20H),186
  121.         DB    10,13,17 DUP(20H),186,44 DUP(20H),186     
  122.         DB     10,13,17 DUP(20H),211,44 DUP(196),189,13,10,"$",1AH     
  123. PROGRAMMER    DB    "File-SNIP:  Scott Penrose.  SNIPPER:  Tom Kihlken"
  124. INSTALLED_MSG    DB    "Already Installed",13,10,"$"
  125. BAD_DOS_MSG    DB    "Requires DOS 2.0+",13,10,"$"
  126. OLDINT09    DD    ?    ;OLD KEYBOARD BREAK INTERRUPT VECTOR
  127. OLDINT13    DD    ?    ;OLD BIOS DISK IO INTERRUPT VECTOR
  128. OLDINT16    DD    ?    ;OLD KEYBOARD INTERRUPT VECTOR
  129. OLDINT21    DD    ?    ;OLD DOS FUNCTION INTERRUPT VECTOR
  130. ERR_STAT    DB    ?    ;ERROR STATUS DURING FILE OUTPUT
  131. PATH_N_FILE    DB    128 DUP (0)
  132. FILE_PATH    DB    114 DUP (0)
  133. FILE_PROMPT    DB    "Enter Filename: "
  134. FILENAME    DB    "FILESNIP.RTT"    ;THE DEFAULT FILENAME
  135.         DB    2 DUP (0)    ;LEAVE ROOM FOR DRIVE AND PATH
  136. TEMP_BUFF_START    EQU    OFFSET INITIALIZE
  137. TEMP_BUFF_NEXT    DW      TEMP_BUFF_START    ;POINTER TO NEXT KEY IN BUFFER
  138. TEMP_BUFF_LAST    DW      TEMP_BUFF_START    ;POINTER TO LAST KEY IN BUFFER
  139. TEMP_BUFF_SIZE    EQU    25*(80+2)    ;ROOM FOR 25 ROWS OF 80 COLUMNS
  140. TEMP_BUFF_END    DW    TEMP_BUFF_START+TEMP_BUFF_SIZE
  141. BUFF_START    EQU    OFFSET INITIALIZE+TEMP_BUFF_SIZE
  142. BUFF_NEXT    DW      BUFF_START    ;POINTER TO NEXT KEY IN BUFFER
  143. BUFF_LAST    DW      BUFF_START    ;POINTER TO LAST KEY IN BUFFER
  144. BUFF_SIZE    EQU    25*(80+2)    ;ROOM FOR 25 ROWS OF 80 COLUMNS
  145. BUFF_END    DW    BUFF_START+BUFF_SIZE
  146. FILE_BUFF_START    EQU    OFFSET INITIALIZE+TEMP_BUFF_SIZE+BUFF_SIZE
  147. FILE_BUFF_NEXT    DW      FILE_BUFF_START    ;POINTER TO NEXT KEY IN BUFFER
  148. FILE_BUFF_LAST    DW      FILE_BUFF_START    ;POINTER TO LAST KEY IN BUFFER
  149. FILE_BUFF_SIZE    EQU    13H          ;19 bytes
  150. FILE_BUFF_END    DW    FILE_BUFF_START+FILE_BUFF_SIZE
  151. TOP_LEFT    LABEL    WORD        ;FIRST CORNER OF WINDOW
  152. LEFT_SIDE    DB    0        ;COLUMN NUMBER OF LEFT SIDE
  153. TOP_ROW        DB    0        ;ROW NUMBER OF TOP SIDE
  154. BOT_RIGHT    LABEL    WORD        ;SECOND CORNER OF WINDOW
  155. RIGHT_SIDE    DB    ?        ;COLUMN NUMBER OR RIGHT SIDE
  156. BOT_ROW        DB    ?        ;ROW NUMBER OF BOTTOM
  157. SEND_CHAR    DW    ?        ;POINTER TO CHARACTER HANDLER
  158. FILE_SEND_CHAR    DW    ?        ;POINTER TO CHARACTER HANDLER
  159. HOME_END_HIT    LABEL    WORD        ;if=1 then home was hit
  160. HOME_END_LOOP    DB    0        ;IF=1, then first time in loop
  161. SEND_KEYS    DB    0        ;IF=1, USE KEYSTROKES FROM BUFFER
  162. FILE_SEND_KEYS    DB    0        ;IF=1, USE KEYSTROKES FROM BUFFER
  163. WRIT_FILE    DB    0        ;IF=1, NEED TO WRITE TO DISK
  164. BUSY_FLAGS    DB    0        ;BIT MASKED AS FOLLOWS:
  165.                     ; 1 - DOS IS ACTIVE
  166.                     ; 2 - BIOS IO IS ACTIVE
  167.                     ; 4 - SNIPPER IS ACTIVE
  168. DOS_STAT    DB    0        ;CURRENT DOS FUNCTION
  169. SPACE_FLAG    DB    0        ;Determine if space should be printed
  170. FILECHAR    DB    0        ;
  171. FILE_EXT    DB    0
  172. CHARS_ON_STACK    DB    0        ;How many chars have been printed
  173. PUNCT_FLAG     DB    0        ;was any punctuation found?
  174. NO_SPACE_FLAG    DB    0
  175. FIRST_CHAR_MARKER    DW    0
  176. HELP_MENU    DB    201,21 DUP(205),187
  177.         DB    186,"  F - File Formatted ",186
  178.         DB    186," Esc- Quit           ",186
  179.         DB    200,21 DUP(205),188
  180. HELP_MENU_ATTR1    DB    23 DUP(4EH)    ;ANSI menu
  181.         DB    23 DUP(4EH)
  182.         DB    23 DUP(4EH)
  183.         DB    23 DUP(4EH)
  184. HELP_MENU_ATTR2    DB    23 DUP(07H)    ;ASCII menu
  185.         DB    23 DUP(07H)
  186.         DB    23 DUP(07H)
  187.         DB    23 DUP(07H)
  188.  
  189. ;------------------------------------------------------------------;
  190. ; SNIPPER BUILDS THE WINDOW AND ACCEPTS COMMANDS FROM THE KEYBOARD ;
  191. ;------------------------------------------------------------------;
  192. SNIPPER        PROC    NEAR
  193.         ASSUME    DS:CSEG, ES:BIOS_SEG
  194.         XOR    BX,BX        ;BX IS INCREMENT FOR ROW/COLUMN
  195. GET_KB_KEY1:
  196.         MOV    DX,TOP_LEFT    ;GET LOCATION OF FIRST CORNER
  197.         ADD    DH,BH        ;ADD IN THE ROW INCREMENT
  198.         ADD    DL,BL        ;ADD IN THE COLUMN INCREMENT
  199.         CMP    DL,0        ;AT LEFT EDGE OF SCREEN?
  200.         JGE    NOT_LEFT_EDGE
  201.         MOV    DL,CRT_COLS    ;JUMP TO THE RIGHT EDGE
  202.         DEC    DL
  203. NOT_LEFT_EDGE:
  204.         CMP    DL,CRT_COLS    ;AT RIGHT EDGE OF SCREEN YET?
  205.         JB    NOT_RIGHT_EDGE    ;IF NOT, KEEP MOVING RIGHT
  206.         XOR    DL,DL        ;IF YES, WRAP TO LEFT EDGE
  207. NOT_RIGHT_EDGE:
  208.         CMP    DH,0        ;AT TOP OF SCREEN YET?
  209.         JGE    NOT_AT_TOP
  210.         MOV    DH,ROWS        ;JUMP DOWN TO THE BOTTOM
  211. NOT_AT_TOP:
  212.         CMP    DH,ROWS        ;AT BOTTOM OF SCREEN?
  213.         JLE    NOT_AT_BOTTOM
  214.         XOR    DH,DH        ;JUMP BACK TO THE TOP
  215. NOT_AT_BOTTOM:
  216.         MOV    TOP_LEFT,DX    ;SAVE NEW CORNER LOCATION
  217.         CALL    REV_VIDEO    ;CHANGE IT TO REVERSE VIDEO
  218.         XOR    AH,AH        ;BIOS KEYBOARD INPUT
  219.         INT    16H        ;GET A KEYSTROKE
  220.         PUSH    AX
  221.         CALL    REV_VIDEO    ;PUT ATTRIBUTE BACK TO NORMAL
  222.         POP    AX
  223.         CMP    AH,1        ;IS IT ESCAPE?
  224.         JNE    NOT_ESC
  225.         RET            ;JUST RETURN TO EXIT
  226. NOT_ESC:
  227.         MOV    BX,0FF00H    ;INCREMENT TO SUBTRACT ONE ROW
  228.         CMP    AH,48H        ;IS IT UP ARROW?
  229.         JE    GET_KB_KEY1
  230.         MOV    BX,0100H    ;INCREMENT TO ADD ONE ROW
  231.         CMP    AH,50H        ;IS IT DOWN ARROW?
  232.         JE    GET_KB_KEY1
  233.         
  234.         MOV    BX,0001H    ;INCREMENT TO ADD ONE COLUMN
  235.         CMP    AH,4FH        ;IS IT END KEY?
  236.         JE    END_HIT        ;jump to END_hit
  237.         
  238.         MOV    BX,0001H    ;INCREMENT TO ADD ONE COLUMN
  239.         CMP    AH,52H        ;IS IT INS KEY?
  240.         JE    INS_HIT    ;jump to PLUS_hit
  241.  
  242.         MOV    BX,0001H    ;INCREMENT TO ADD ONE COLUMN
  243.         CMP    AH,4DH        ;IS IT RIGHT ARROW?
  244.         JE    GET_KB_KEY1
  245.         
  246.         MOV    BX,00FFH    ;INCREMENT TO SUBTRACT ONE COLUMN
  247.         CMP    AH,47H        ;Is it home key
  248.         JE    HOME_HIT    ;jump to home_hit
  249.  
  250.         MOV    BX,00FFH    ;INCREMENT TO SUBTRACT ONE COLUMN
  251.         CMP    AH,4BH        ;IS IT LEFT ARROW?
  252.         JNE    NOT_LEFT_ARROW
  253.         JMP    GET_KB_KEY1
  254. NOT_LEFT_ARROW:
  255.         XOR    BX,BX
  256.         CMP    AL,13        ;IS IT A CARRIAGE RETURN?
  257.         JNE    NOT_CR
  258.         MOV    DX,TOP_LEFT    ;A CARRIAGE RETURN WAS PRESSED
  259.         MOV    BOT_RIGHT,DX    ;INITIALIZE THE SECOND CORNER
  260.         CALL    REV_VIDEO    ;CHANGE IT BACK TO REVERSE VIDEO
  261.         JMP    SHORT GET_KB_KEY2
  262. NOT_CR:
  263.         JMP    GET_KB_KEY1    ;JUST GET ANOTHER KEY
  264. HOME_HIT:
  265.         MOV    DL,0        ;put cursor at beginning of line
  266.         MOV    BL,0        ;
  267.         PUSH    DX
  268.         MOV    DX,TOP_LEFT
  269.         MOV    DL,0H
  270.         MOV    TOP_LEFT,DX
  271.         POP    DX
  272.         JMP    GET_KB_KEY1    ;JUST GET ANOTHER KEY
  273. END_HIT:
  274.         MOV    BL,0H        ;put cursor at end of line.
  275.         MOV    DL,0H        ;
  276.         PUSH    DX
  277.         MOV    DX,TOP_LEFT
  278.         MOV    DL,4FH
  279.         MOV    TOP_LEFT,DX
  280.         POP    DX
  281.         JMP    GET_KB_KEY1    ;JUST GET ANOTHER KEY
  282. INS_HIT:
  283.         MOV    BL,0H        ;put cursor at 34th column
  284.         MOV    DL,0H        ;
  285.         PUSH    DX
  286.         MOV    DX,TOP_LEFT
  287.         MOV    DL,21H
  288.         MOV    TOP_LEFT,DX
  289.         POP    DX
  290.         JMP    GET_KB_KEY1    ;JUST GET ANOTHER KEY
  291. GET_KB_KEY2:
  292.         MOV    HOME_END_HIT,0000H    ;clear flag for home/end key
  293.         XOR    AH,AH
  294.         INT    16H        ;GET A KEYSTROKE
  295. GOT_KEY2:    MOV    DX,BOT_RIGHT
  296.         CMP    AH,48H        ;IS IT UP ARROW?
  297.         JNE    NEXT_1
  298.         JMP    SUB_ROW_1    ;SUBTRACT A ROW FROM WINDOW
  299. NEXT_1:
  300.         CMP    AH,50H        ;IS IT DOWN ARROW?
  301.         JNE    NEXT_2
  302.         JMP    ADD_ROW_1    ;ADD A ROW TO THE WINDOW
  303. NEXT_2:    
  304.         CMP    AH,4DH        ;IS IT RIGHT ARROW?
  305.         JNE    NEXT_3
  306.         JMP    ADD_COL        ;ADD A COLUMN TO THE WINDOW
  307. NEXT_3:
  308.         CMP    AH,4BH        ;IS IT LEFT ARROW?
  309.         JNE    NEXT_4
  310.         JMP    SUB_COL        ;SUBTRACT A COLUMN FROM WINDOW
  311. NEXT_4:
  312.         CMP    AH,47H        ;is it home key.
  313.         JNE    NEXT_5
  314.         MOV    HOME_END_HIT,0001H
  315.         MOV    HOME_END_LOOP,01H
  316.         JMP    SUB_COL    
  317. NEXT_5:
  318.         CMP    AH,4FH        ;is it end key?
  319.         JNE    NEXT_6
  320.         MOV    HOME_END_HIT,0100H
  321.         JMP    ADD_COL
  322. NEXT_6:
  323.         JMP    NOT_ARROW_KEY
  324. SUB_COL:
  325.         CMP    DH,TOP_ROW
  326.         JG    OK_GO_BACK
  327.         CMP    DL,LEFT_SIDE    ;DONT ERASE IT COMPLETELY
  328.         JLE    GET_KB_KEY2
  329. OK_GO_BACK:
  330.         CMP    DL,0        ;DONT ERASE IT COMPLETELY
  331.         JLE    GET_KB_KEY2
  332.         DEC    DL        ;SUBTRACT A COLUMN
  333.         MOV    RIGHT_SIDE,DL    ;SAVE NEW RIGHT SIDE COLUMN
  334.         INC    DL
  335. DONT_INC_DL:
  336.         JMP    SHORT COL_LOOP
  337. ADD_COL:
  338.         INC    DL        ;ADD A COLUMN
  339.         CMP    DL,CRT_COLS    ;AT RIGHT EDGE OF SCREEN?
  340.         JL    ADD_COL_1
  341.         JMP    GET_KB_KEY2    ;STOP WHEN SCREEN IS FILLED
  342. ADD_COL_1:
  343.         MOV    RIGHT_SIDE,DL    ;SAVE NEW RIGHT SIDE COLUMN
  344. COL_LOOP:
  345.         CMP    HOME_END_HIT,0001H
  346.         JZ    COL_LOOP_1
  347.         CMP    HOME_END_HIT,0100H
  348.         JZ    COL_LOOP_2
  349.         CALL    REV_VIDEO    ;REVERSE THIS CHARACTER
  350.         JMP    GET_KB_KEY2
  351. COL_LOOP_1:
  352.         CALL    REV_VIDEO    ;REVERSE THIS CHARACTER
  353.         DEC    DL
  354.         JMP    SUB_COL
  355. COL_LOOP_2:
  356.         CALL    REV_VIDEO    ;REVERSE THIS CHARACTER
  357.         JMP    ADD_COL
  358. SUB_ROW_1:
  359.         CMP    DH,TOP_ROW    ;AT TOP OF WINDOW?
  360.         JG    SUB_ROW_2
  361.         JMP    GET_KB_KEY2    ;DONT ERASE IT COMPLETELY
  362. SUB_ROW_2:
  363.         PUSH    DX
  364. SUB_ROW:
  365.         CALL    REV_VIDEO
  366.         DEC    DL        ;SUBTRACT A COLUMN
  367.         CMP    DL,0        ;DONT ERASE IT COMPLETELY
  368.         JL    SUB_ROW_PLUS
  369.         JMP    SUB_ROW
  370. SUB_ROW_PLUS:
  371.         POP    DX
  372.         PUSH    CX
  373.         MOV    CX,TOP_LEFT
  374.         INC    CH
  375.         CMP    CH,DH
  376.         JE    ON_SECOND_ROW
  377.         JMP    SUB_ROW_PLUS_1
  378. ON_SECOND_ROW:        
  379.         CMP    CL,DL
  380.         JLE    SUB_ROW_PLUS_1
  381.         MOV    DL,CL
  382.         MOV    BOT_RIGHT,DX
  383. SUB_ROW_PLUS_1:
  384.         POP    CX
  385.         DEC     DH
  386.         MOV    BOT_ROW,DH
  387.         PUSH    DX
  388. SUB_ROW_PLUS_2:
  389.         CMP    DL,79
  390.         JGE    AT_END
  391.         INC    DL
  392.         CALL    REV_VIDEO
  393.         JMP    SUB_ROW_PLUS_2
  394. AT_END:        
  395.         POP    DX
  396.         JMP    GET_KB_KEY2
  397.         
  398.         
  399. ADD_ROW_1:
  400.         CMP    DH,ROWS        ;AT BOTTOM OF SCREEN?
  401.         JL    ADD_ROW_1_1
  402.         JMP    GET_KB_KEY2    ;STOP WHEN SCREEN IS FILLED
  403. ADD_ROW_1_1:
  404.         PUSH    DX
  405. ADD_ROW:
  406.         CMP    DL,79
  407.         JZ    SKIP_INC
  408.         INC     DL
  409.         CALL    REV_VIDEO
  410. SKIP_INC:
  411.         CMP    DL,78
  412.         JG    ADD_ROW_PLUS
  413.         JMP     ADD_ROW
  414. ADD_ROW_PLUS:
  415.         POP    DX
  416.         CMP    DH,ROWS        ;AT BOTTOM OF SCREEN?
  417.         JL    NOT_BOT
  418.         JMP    GET_KB_KEY2    ;STOP WHEN SCREEN IS FILLED
  419. NOT_BOT:
  420.         INC    DH
  421.         MOV    BOT_ROW,DH
  422. ROW_LOOP:
  423.         CALL    REV_VIDEO    ;REVERSE THIS CHARACTER
  424.         DEC    DL        ;MOVE TO NEXT COLUMN
  425.         CMP    DL,0        ;AT LEFT EDGE YET?
  426.         JGE    ROW_LOOP    ;CONTINUE UNTIL AT LEFT EDGE
  427.         JMP    GET_KB_KEY2
  428. NOT_ARROW_KEY:
  429.         MOV    TEMP_BUFF_NEXT,TEMP_BUFF_START
  430.         MOV    TEMP_BUFF_LAST,TEMP_BUFF_START
  431.         MOV    FILE_BUFF_NEXT,FILE_BUFF_START
  432.         MOV    FILE_BUFF_LAST,FILE_BUFF_START
  433.         MOV    SEND_CHAR,OFFSET BUFF_CHAR
  434.         CMP    AH,21H        ;IS IT THE "F" KEY
  435.         JNE    NOT_F
  436.         MOV    WRIT_FILE,0
  437.         MOV    FILE_SEND_CHAR,OFFSET FILE_BUFF_CHAR
  438.         CALL    GET_FILENAME
  439.         CMP    WRIT_FILE,-1    ;WAS ESCAPE REQUESTED?
  440.         JE    ERASE_BOX
  441.         CALL    FORMAT_OUTPUT
  442.         CALL    COPY_TO_REG_BUFF
  443.         MOV    WRIT_FILE,1
  444.         MOV    FILE_SEND_KEYS,01H
  445.         TEST    BUSY_FLAGS,00000011B     ;IS INT21 OR INT13 BUSY?
  446.         JNZ    RETURN        ;IF YES, WAIT TILL LATER
  447.         CALL    WRITE_TO_FILE    ;IF NOT, DO IT NOW
  448. RETURN:
  449.         RET
  450. NOT_F:
  451.         CMP    AH,1        ;IS IT ESCAPE?
  452.         JE    ERASE_BOX ;IF YES, ERASE BOX AND EXIT
  453.         CMP    AL,13        ;IS IT A CARRIAGE RETURN?
  454.         JE    DISPLAY_HELP    ;IF YES, DISPLAY HELP
  455.         JMP    GET_KB_KEY2    ;OTHERWISE JUST GET ANOTHER KEY
  456. ERASE_BOX:
  457.         MOV    SEND_CHAR,OFFSET RETURN
  458.         JMP    FORMAT_OUTPUT
  459. DISPLAY_HELP:
  460.         CALL    EXCHANGE_HELP    ;PUT UP THE HELP MENU
  461.         XOR    AH,AH
  462.         INT    16H        ;GET ANOTHER KEYSTROKE
  463.         PUSH    AX        ;SAVE THE KEYSTROKE
  464.         CALL    EXCHANGE_HELP    ;PULL DOWN THE HELP MENU
  465.         POP    AX        ;GET BACK THE KEYSTROKE
  466.         JMP    GOT_KEY2
  467. ;*********************************************************************
  468. REV_VIDEO:
  469.         CALL    READ_CHAR    ;READ CHARACTER AND ATTRIBUTE
  470.         MOV    BL,AH        ;SAVE ATTRIBUTE IN BL
  471.         AND    BL,10001000B    ;GET BLINK AND INTENSITY BITS
  472.         AND    AH,01110111B    ;NOW LOOK ONLY AT COLOR BITS
  473.         MOV    CL,4        ;ROTATE FOUR COUNTS
  474.         ROR    AH,CL        ;ROTATE FOREGROUND AND BACKGROUND
  475.         OR    BL,AH        ;PUT BACK BLINK AND INTENSITY BITS
  476.         CALL    DISPLAY_CHAR    ;WRITE CHARACTER AND ATTRIBUTE
  477.         RET
  478. ;*********************************************************************
  479. ;---------------------------------------------------------------------;
  480. ; Proceedure to read char off screen, and send to file formatted.
  481. ; 11-05-90  12:15am
  482. ;---------------------------------------------------------------------;
  483. FORMAT_OUTPUT:    
  484.         PUSH    AX
  485.         PUSH    BX
  486.         PUSH    CX
  487.         PUSH    DX
  488.         MOV    DX,TOP_LEFT    ;GET LOCATION OF FIRST CORNER
  489.         MOV    SPACE_FLAG,00H
  490.         MOV    PUNCT_FLAG,00H
  491.         MOV    CHARS_ON_STACK,00H
  492. READ_LOOP_NEW:
  493.         CALL    REV_VIDEO
  494.         CALL    READ_CHAR
  495.         CMP    AL,20H
  496.         JNE    READ_LOOP_NEW_1
  497.         JMP    WAS_SPACE
  498. READ_LOOP_NEW_1:
  499.         CMP    AL,7CH
  500.         JNE    NOT_PIPE
  501.         JMP    MOVE_TO_NEXT_CHAR
  502. NOT_PIPE:
  503.         CMP    AL,21H        ;is it a "!"
  504.         JNE    NOT_PIPE_1
  505.         JMP    PUNCT
  506. NOT_PIPE_1:
  507.         CMP    AL,2EH        ;is it a "."
  508.         JNE    NOT_PERIOD
  509.         JMP    PUNCT
  510. NOT_PERIOD:
  511.         CMP    AL,3FH        ;is it a "?"
  512.         JNE    NOT_QUESTION
  513.         JMP    PUNCT
  514. NOT_QUESTION:
  515.         CMP    AL,3AH        ;is it a ":"
  516.         JNE    NOT_COLON
  517.         JMP    PUNCT
  518. NOT_COLON:
  519.         CMP    AL,3BH        ;is it a ";"
  520.         JNE    NOT_SEMICOLON
  521.         JMP    PUNCT
  522. NOT_SEMICOLON:
  523. READ_NEW_1:
  524.         CMP    SPACE_FLAG,01
  525.         JE    SPACE_SET
  526.         CALL    SEND_CHAR
  527.         INC    CHARS_ON_STACK
  528. MOVE_TO_NEXT_CHAR:
  529.         CMP    DH,BOT_ROW
  530.         JE    LAST_LINE_NEW
  531.         INC    DL
  532.         CMP     DL,79
  533.         JG    MOVE_1
  534.         JMP    READ_LOOP_NEW
  535. MOVE_1:
  536.         PUSH    AX
  537.         MOV    AL,20H
  538.         CALL    SEND_CHAR
  539.         POP    AX
  540.         MOV    CHARS_ON_STACK,00H
  541.         MOV    SPACE_FLAG,00H
  542.         MOV    PUNCT_FLAG,00H
  543.         INC    DH
  544.         MOV    DL,0
  545.         CMP    DH,BOT_ROW
  546.         JG    MOVE_3
  547.         JMP    READ_LOOP_NEW
  548. MOVE_3:
  549.         CALL    REV_VIDEO
  550. LAST_LINE_NEW:
  551.         INC     DL
  552.         CMP    DL,RIGHT_SIDE
  553.         JG    LAST_LINE_NEW_1
  554.         JMP     READ_LOOP_NEW
  555. LAST_LINE_NEW_1:
  556.         CALL    CR_LF
  557.         POP    DX
  558.         POP    CX
  559.         POP    BX
  560.         POP    AX
  561.         RET
  562. SPACE_SET:
  563.         CMP    CHARS_ON_STACK,0
  564.         JE    NO_PUNCT_FLAG
  565.         PUSH    AX
  566.         MOV    AX,0020H
  567.         CALL     SEND_CHAR
  568.         POP    AX
  569.         INC    CHARS_ON_STACK
  570.         CMP    PUNCT_FLAG,01H 
  571.         JNE    NO_PUNCT_FLAG
  572.         MOV    PUNCT_FLAG,00H
  573.         PUSH    AX
  574.         MOV    AX,0020H
  575.         CALL     SEND_CHAR
  576.         POP    AX
  577.         INC    CHARS_ON_STACK
  578.         CALL    SEND_CHAR
  579.         INC    CHARS_ON_STACK
  580.         MOV    SPACE_FLAG,00H
  581.         JMP    MOVE_TO_NEXT_CHAR
  582. NO_PUNCT_FLAG:
  583.         CALL     SEND_CHAR
  584.         INC    CHARS_ON_STACK
  585.         MOV    SPACE_FLAG,00H
  586.         JMP    MOVE_TO_NEXT_CHAR
  587. PUNCT:
  588.         CMP    CHARS_ON_STACK,0
  589.         JNE    PUNCT_1
  590.         JMP    READ_NEW_1
  591. PUNCT_1:
  592.         MOV    PUNCT_FLAG,01H
  593.         JMP    READ_NEW_1
  594. WAS_SPACE:
  595.         MOV    SPACE_FLAG,01H    
  596.         JMP    MOVE_TO_NEXT_CHAR
  597. ;*********************************************************************
  598. COPY_TO_REG_BUFF:
  599.         PUSH    AX
  600.         PUSH    BX
  601.         PUSH    CX
  602.         PUSH    DX
  603.         MOV    AX,TEMP_BUFF_START
  604.         MOV    DX,TEMP_BUFF_START
  605.         MOV    CX,BUFF_START
  606. BUFFER_EXCHANGE_LOOP:
  607.         MOV    BX,0048H
  608.         PUSH    DX
  609.         INC    DX
  610.         MOV    FIRST_CHAR_MARKER,DX
  611.         DEC    DX
  612.         ADD    DX,BX
  613.         MOV    BX,DX
  614.         POP    DX
  615.         CMP    BX,TEMP_BUFF_LAST    
  616.         JLE     BUFF_CHECKING_LOOP
  617.         JMP    BUFF_EXCHNG_END
  618. BUFF_CHECKING_LOOP:
  619.         PUSH    AX
  620.         MOV    AX,[BX]
  621.         CMP    AL,20H
  622.         JE    FOUND_SPACE_BEFORE_72_1
  623.         CMP    AL,5CH
  624.         JE    FOUND_SPACE_BEFORE_72_1
  625.         CMP    AL,2FH
  626.         JE    FOUND_SPACE_BEFORE_72_1
  627.         CMP    AL,5FH
  628.         JE    FOUND_SPACE_BEFORE_72_1
  629.         CMP    AL,2BH
  630.         JE    FOUND_SPACE_BEFORE_72_1
  631.         CMP    AL,2DH
  632.         JE    FOUND_SPACE_BEFORE_72_1
  633.         CMP    BX,FIRST_CHAR_MARKER
  634.         JLE    NO_SPACE_IN_LINE
  635.         POP    AX
  636.         DEC    BX
  637.         JMP     BUFF_CHECKING_LOOP
  638. NO_SPACE_IN_LINE:
  639.         PUSH    DX
  640.         MOV    DX,BX
  641.         ADD    DX,47H
  642.         MOV    BX,DX
  643.         POP    DX
  644.         MOV    NO_SPACE_FLAG,01H
  645. FOUND_SPACE_BEFORE_72_1:
  646.         POP    AX
  647. FOUND_SPACE_BEFORE_72:
  648.         CMP    AX,BX
  649.         JG    FINISHED_WITH_LINE
  650.         PUSH    BX
  651.         PUSH    DX
  652.         MOV    BX,AX
  653.         MOV    DX,[BX]
  654.         MOV    BX,CX
  655.         MOV    [BX],DX
  656.         POP    DX
  657.         POP    BX
  658.         INC    CX
  659.         INC    AX
  660.         JMP     FOUND_SPACE_BEFORE_72
  661. FINISHED_WITH_LINE:
  662.         CMP    NO_SPACE_FLAG,01H
  663.         JNE    NO_HYPHEN_NEEDED
  664.         MOV    NO_SPACE_FLAG,00H
  665.         PUSH    BX
  666.         PUSH    DX
  667.         MOV    DX,2DH
  668.         MOV    BX,CX
  669.         MOV    [BX],DX
  670.         POP    DX
  671.         POP    BX
  672.         INC    CX
  673. NO_HYPHEN_NEEDED:
  674.         PUSH    BX
  675.         PUSH    DX
  676.         MOV    DX,0DH
  677.         MOV    BX,CX
  678.         MOV    [BX],DX
  679.         POP    DX
  680.         POP    BX
  681.         INC    CX
  682.         PUSH    BX
  683.         PUSH    DX
  684.         MOV    DX,0AH
  685.         MOV    BX,CX
  686.         MOV    [BX],DX
  687.         POP    DX
  688.         POP    BX
  689.         INC    CX
  690.         MOV    DX,AX
  691.         JMP     BUFFER_EXCHANGE_LOOP
  692. BUFF_EXCHNG_END:
  693.         CMP    AX,TEMP_BUFF_LAST
  694.         JGE    BUFF_EXCHANGE_RET
  695.         PUSH    BX
  696.         PUSH    DX
  697.         MOV    BX,AX
  698.         MOV    DX,[BX]
  699.         MOV    BX,CX
  700.         MOV    [BX],DX
  701.         POP    DX
  702.         POP    BX
  703.         INC    CX
  704.         INC    AX
  705.         JMP    BUFF_EXCHNG_END
  706. BUFF_EXCHANGE_RET:
  707.         ;PUSH    BX
  708.         ;PUSH    DX
  709.         ;MOV    DX,0DH
  710.         ;MOV    BX,CX
  711.         ;MOV    [BX],DX
  712.         ;POP    DX
  713.         ;POP    BX
  714.         ;INC    CX
  715.         ;PUSH    BX
  716.         ;PUSH    DX
  717.         ;MOV    DX,0AH
  718.         ;MOV    BX,CX
  719.         ;MOV    [BX],DX
  720.         ;POP    DX
  721.         ;POP    BX
  722.         MOV    BUFF_LAST,CX
  723.         POP    DX
  724.         POP    CX
  725.         POP    BX
  726.         POP    AX
  727.         RET
  728. ;*********************************************************************
  729. CR_LF:
  730.         MOV    AL,13
  731.         CALL    SEND_CHAR    ;SEND A CARRIAGE RETURN
  732.         MOV    AL,10
  733.         CALL    SEND_CHAR    ;SEND A LINE FEED
  734.         RET
  735. ;*********************************************************************
  736. DISPLAY_CHAR:
  737.         PUSH    BX        ;SAVE THE ATTRIBUTE
  738.         CALL    GET_CURS_ADDR    ;GET ADDRESS OF BIOS CURSOR
  739.         MOV    ES:[BX],DX    ;TELL BIOS WHERE THE CURSOR IS
  740.         POP    BX        ;GET BACK THE ATTRIBUTE
  741.         MOV    BH,ACTIVE_PAGE    ;GET ACTIVE PAGE
  742.         PUSH    CX        ;SAVE THE LOOP COUNT
  743.         MOV    CX,1        ;WRITE 1 CHARACTER
  744.         MOV    AH,9        ;WRITE CHARACTER AND ATTRIBUTE
  745.         INT    10H
  746.         POP    CX        ;RECOVER LOOP COUNT
  747.         RET            ;DONE WRITING THE CHARACTER
  748. ;*********************************************************************
  749. READ_CHAR:
  750.         CALL    GET_CURS_ADDR    ;GET ADDRESS OF BIOS CURSOR
  751.         MOV    ES:[BX],DX    ;TELL BIOS WHERE THE CURSOR IS
  752.         MOV    BH,ACTIVE_PAGE    ;GET ACTIVE PAGE
  753.         MOV    AH,8        ;BIOS FUNCTION TO READ CHARACTER
  754.         INT    10H        ;READ THE CHARACTER/ATTRIBUTE
  755.         RET
  756. ;*********************************************************************
  757. PRINT_CHAR:
  758.         PUSH    DX
  759.         XOR    AH,AH        ;USE FUNCTION 0
  760.         XOR    DX,DX        ;PRINTER NUMBER 0
  761.         INT    17H        ;BIOS PRINT CHARACTER FUNCTION
  762.         ROR    AH,1        ;LOOK AT BIT ZERO
  763.         JNC    PRINT_OK    ;DID A TIMEOUT OCCUR?
  764.         MOV    SEND_CHAR,OFFSET RETURN
  765. PRINT_OK:
  766.         POP    DX
  767.         RET            ;DONE PRINTING CHARACTER
  768. ;*********************************************************************
  769. BUFF_CHAR:
  770.         MOV    BX,TEMP_BUFF_LAST    ;GET LOCATION OF LAST CHARACTER
  771.         MOV    [BX],AL        ;PUT THE CHARACTER IN BUFFER
  772.         INC    BX        ;ADVANCE THE POINTER
  773.         MOV    TEMP_BUFF_LAST,BX    ;CHECK FOR BUFFER FULL
  774.         CMP    BX,TEMP_BUFF_END    ;IS THE BUFFER FULL YET?
  775.         JNE    BUFF_OK        ;IF NOT, KEEP GOING
  776.         MOV    SEND_CHAR,OFFSET RETURN
  777. BUFF_OK:
  778.         RET            ;NOW ITS IN THE BUFFER
  779. ;*********************************************************************
  780. FILE_BUFF_CHAR:
  781.         MOV    BX,FILE_BUFF_LAST    ;GET LOCATION OF LAST CHARACTER
  782.         MOV    [BX],AL        ;PUT THE CHARACTER IN BUFFER
  783.         INC    BX        ;ADVANCE THE POINTER
  784.         MOV    FILE_BUFF_LAST,BX    ;CHECK FOR BUFFER FULL
  785.         CMP    BX,FILE_BUFF_END    ;IS THE BUFFER FULL YET?
  786.         JNE    FILE_BUFF_OK        ;IF NOT, KEEP GOING
  787.         MOV    FILE_SEND_CHAR,OFFSET RETURN
  788. FILE_BUFF_OK:
  789.         RET            ;NOW ITS IN THE BUFFER
  790. ;*********************************************************************
  791. GET_CURS_ADDR:
  792.         MOV    BL,ACTIVE_PAGE    ;GET THE CURRENT PAGE NUMBER
  793.         XOR    BH,BH        ;CONVERT TO A WORD OFFSET
  794.         SHL    BX,1        ;TIMES TWO FOR A WORD
  795.         ADD    BX,OFFSET CURSOR_POSN ;ADD IN BASE ADDRESS
  796.         RET
  797. ;*********************************************************************
  798. EXCHANGE_HELP:
  799.         XOR    DX,DX        ;START AT TOP LEFT CORNER
  800.         PUSH    DI
  801.         LEA    SI,HELP_MENU
  802.         MOV    AH,15
  803.         INT    10H
  804.         CMP    AL,7
  805.         JE    MONO_HELP
  806.         LEA    DI,HELP_MENU_ATTR1
  807.         JMP    EXCHANGE_LOOP
  808. MONO_HELP:
  809.         LEA    DI,HELP_MENU_ATTR2
  810. EXCHANGE_LOOP:
  811.         CMP    DL,23        ;AT LAST COLUMN IN THIS ROW YET?
  812.         JL    SWAP_CHAR
  813.         XOR    DL,DL        ;BACK TO FIRST COLUMN
  814.         INC    DH        ;DO THE NEXT ROW
  815.         CMP    DH,4        ;AT LAST ROW YET?
  816.         JL    SWAP_CHAR    ;QUIT WHEN LAST ROW IS DONE
  817.         POP    DI
  818.         RET
  819. SWAP_CHAR:
  820.         CALL    READ_CHAR    ;READ CHARACTER AT THIS POSITION
  821.         XCHG    AL,CS:[SI]    ;SWAP WITH THE HELP TEXT
  822.         XCHG    AH,CS:[DI]    ;SWAP WITH THE HELP TEXT
  823.         MOV    BL,AH        ;ATTRIBUTE IS THE SAME
  824.         CALL    DISPLAY_CHAR    ;PUT NEW CHARACTER ON SCREEN
  825.         INC    DL        ;POINT TO NEXT POSITION
  826.         INC    SI
  827.         INC    DI
  828.         JMP EXCHANGE_LOOP
  829. ;*********************************************************************
  830. TEST_FILENAME_CHAR:
  831.         CMP    AL,2EH
  832.         JE    FILECHAR_1
  833.         CMP    AL,20H
  834.         JLE    FILECHAR_1
  835.         CMP    AL,22H
  836.         JE    FILECHAR_1
  837.         CMP    AL,25H
  838.         JE    FILECHAR_1
  839.         CMP    AL,2AH
  840.         JE    FILECHAR_1
  841.         CMP    AL,2BH
  842.         JE    FILECHAR_1
  843.         CMP    AL,2CH
  844.         JE    FILECHAR_1
  845.         CMP    AL,2FH
  846.         JE    FILECHAR_1
  847.         CMP    AL,3AH
  848.         JE    FILECHAR_1
  849.         CMP    AL,3BH
  850.         JE    FILECHAR_1
  851.         CMP    AL,3CH
  852.         JE    FILECHAR_1
  853.         CMP    AL,3DH
  854.         JE    FILECHAR_1
  855.         CMP    AL,3EH
  856.         JE    FILECHAR_1
  857.         CMP    AL,7FH
  858.         JGE    FILECHAR_1
  859.         CMP    AL,5BH
  860.         JE    FILECHAR_1
  861.         CMP    AL,5CH
  862.         JE    FILECHAR_1
  863.         CMP    AL,5DH
  864.         JE    FILECHAR_1
  865.         CMP    AL,5EH
  866.         JE    FILECHAR_1
  867.         CMP    AL,60H
  868.         JE    FILECHAR_1
  869.         CMP    FILE_EXT,00H
  870.         JE    NOT_EXTEN
  871.         CMP    CL,04H
  872.         JE    FILECHAR_1
  873.         RET
  874. NOT_EXTEN:
  875.         CMP    CL,08H
  876.         JE    FILECHAR_1
  877.         RET
  878. FILECHAR_1:
  879.         MOV    FILECHAR,01
  880.         RET
  881. GET_FILENAME:
  882.         PUSH    BX
  883.         PUSH    AX
  884.         MOV    AX,1BH
  885.         CALL    FILE_SEND_CHAR
  886.         MOV    AX,0046H
  887.         CALL    FILE_SEND_CHAR
  888.         MOV    AX,004CH
  889.         CALL    FILE_SEND_CHAR
  890.         MOV    AX,0020H
  891.         CALL    FILE_SEND_CHAR
  892.         POP    AX
  893.         PUSH    DI
  894.         PUSH    SI
  895.         MOV    FILE_EXT,00H
  896.         MOV    FILECHAR,00H
  897.         PUSH    DX
  898.         PUSH    CX
  899.         MOV    CL,00H
  900.         MOV    DX,TOP_LEFT
  901.         MOV    DL,0
  902.         LEA    SI,FILENAME
  903. GET_FILENAME_1:
  904.         CALL    READ_CHAR
  905.         CALL    TEST_FILENAME_CHAR
  906.         CMP    FILECHAR,00H
  907.         JNE    END_OF_FILENAME_1
  908.         CMP    FILE_EXT,00H
  909.         JNE    FILE_EXTEN
  910.         MOV    CS:[SI],AL
  911.         INC    SI
  912. FILE_EXTEN:
  913.         CALL    FILE_SEND_CHAR
  914.         INC    DL
  915.         INC    CL
  916.         JMP    GET_FILENAME_1
  917. END_OF_FILENAME_1:
  918.         CMP    CL,0
  919.         JE     END_OF_FILENAME_A
  920.         CMP    FILE_EXT,01H
  921.         JE    AT_END_OF_FILENAME
  922.         MOV    FILECHAR,00H
  923.         MOV    FILE_EXT,01H
  924.         JMP    FILE_EXTEN
  925. AT_END_OF_FILENAME:
  926.         MOV    AL,0AH
  927.         CALL    FILE_SEND_CHAR
  928.         MOV    AL,0DH
  929.         CALL    FILE_SEND_CHAR
  930.         MOV    AL,2EH
  931.         MOV    CS:[SI],AL
  932.         INC    SI
  933.         MOV    AL,52H
  934.         MOV    CS:[SI],AL
  935.         INC    SI
  936.         MOV    AL,54H
  937.         MOV    CS:[SI],AL
  938.         INC    SI
  939.         MOV    AL,54H
  940.         MOV    CS:[SI],AL
  941.         INC    SI
  942. FILL_TO_END:
  943.         CMP    CL,0DH
  944.         JE    END_OF_FILENAME_A
  945.         MOV    AL,0H
  946.         MOV    CS:[SI],AL
  947.         INC    CL
  948.         INC    SI
  949.         JMP    FILL_TO_END
  950. END_OF_FILENAME_A:
  951.         POP    CX
  952.         POP    DX
  953.         LEA    SI,FILE_PROMPT    ;POINT TO THE PROMPT FOR SOURCE
  954.         XOR    DI,DI        ;USE THE PSP FOR BUFFER
  955.         XOR    DX,DX        ;PUT PROMPT AT TOP LEFT CORNER
  956.         MOV    CX,29        ;USE MAX OF 40 CHARACTERS
  957.         POP    BX
  958. DISPLAY_PROMPT:
  959.         PUSH    CX        ;SAVE LOOP COUNT
  960.         CALL    READ_CHAR    ;GET CHARACTER ON THIS LINE
  961.         MOV    CS:[DI],AX    ;STORE IT IN THE PSP
  962.         INC    DI        ;ADD TWO FOR NEXT CHARACTER
  963.         INC    DI
  964.         MOV    AL,CS:[SI]    ;GET NEXT PROMPT CHARACTER
  965.         INC    SI        ;NEXT CHARACTER IN PROMPT
  966.         MOV    BL,47H        ;ATTRIBUTE FOR PROMPT
  967.         CALL    DISPLAY_CHAR    ;PUT UP THE PROMPT CHARACTER
  968.         INC    DL        ;POINT TO NEXT COLUMN
  969.         POP    CX        ;GET BACK LOOP COUNT
  970.         LOOP    DISPLAY_PROMPT    ;ENTIRE PROMPT AND FILENAME
  971. FIND_LAST_LETTER:
  972.         DEC    SI        ;BACKUP TO LAST LETTER
  973.         DEC    DL        ;BACKUP TO LAST COLUMN
  974.         CMP    BYTE PTR [SI],0    ;IS THIS A LETTER?
  975.         JE    FIND_LAST_LETTER;BACKUP UNTILL A LETTER IS FOUND
  976.         INC    DL        ;PUT BLINKING BOX AT LAST LETTER
  977. READ_KB:
  978.         MOV    AL,219        ;ASCII FOR BOX CHARACTER
  979.         MOV    BL,47H+80H    ;MAKE IT A BLINKING BOX CHARACTER
  980.         CALL    DISPLAY_CHAR    ;WRITE THE BLINKING BOX
  981.         XOR    AH,AH        ;FUNCTIO 0 TO GET NEXT KEY
  982.         INT    16H        ;BIOS KEYBOARD INPUT
  983.         CMP    AL,13        ;IS IT A CARRIAGE RETURN?
  984.         JE    ERASE_PROMPT
  985.         CMP    AL,8        ;IS IT A BACKSPACE?
  986.         JE    BACK_SPACE
  987.         CMP    AH,1        ;IS IT ESCAPE?
  988.         JNE    READ_KBDRD_2
  989.         MOV    WRIT_FILE,-1    ;INDICATE ESCAPE IS REQUESTED
  990. READ_KBDRD_1:
  991.         CMP    DL,16        ;AT BEGINNING OF LINE?
  992.         JLE    READ_KB        ;IF YES, CAN'T BACKUP FROM HERE
  993.         MOV    AL,0        ;WRITE A NORMAL BLANK (ASCII 0)
  994.         MOV    BL,47H        ;ATTRIBUTE FOR FILENAME
  995.         CALL    DISPLAY_CHAR    ;WRITE THE LETTER
  996.         DEC    DL        ;BACKUP THE CURSOR
  997.         JMP    READ_KBDRD_1
  998. READ_KBDRD_2:
  999.         CMP    AL,"."        ;IS IT A VALID LETTER?
  1000.         JL    READ_KB
  1001.         CMP    AL,"z"        ;IS IT A VALID LETTER?
  1002.         JG    READ_KB
  1003.         CMP    DL,28        ;ONLY ALLOW 40 CHARACTERS
  1004.         JGE    READ_KB
  1005. TTY_KEY:
  1006.  
  1007.         MOV    WRIT_FILE,0    ;FIX ESCAPE HIT THEN CHARS.
  1008.         MOV    BL,47H        ;ATTRIBUTE FOR FILENAME
  1009.         CALL    DISPLAY_CHAR    ;WRITE THE LETTER
  1010.         INC    DL        ;MOVE TO NEXT COLUMN
  1011.         JMP    READ_KB        ;GET ANOTHER KEYSTROKE
  1012. BACK_SPACE:
  1013.         CMP    DL,16        ;AT BEGINNING OF LINE?
  1014.         JLE    READ_KB        ;IF YES, CAN'T BACKUP FROM HERE
  1015.         MOV    AL,0        ;WRITE A NORMAL BLANK (ASCII 0)
  1016.         MOV    BL,47H        ;ATTRIBUTE FOR FILENAME
  1017.         CALL    DISPLAY_CHAR    ;WRITE THE LETTER
  1018.         DEC    DL        ;BACKUP THE CURSOR
  1019.         JMP    READ_KB        ;THEN GET THE NEXT KEY
  1020. ESC_RET:
  1021.         MOV    WRIT_FILE,-1    ;INDICATE ESCAPE IS REQUESTED
  1022. ERASE_PROMPT:
  1023.         XOR    AL,AL        ;GET RID OF THE CURSOR
  1024.         CALL    DISPLAY_CHAR    ;WRITE THE LETTER
  1025.         LEA    DI,FILE_PROMPT    ;COPY TO FILENAME
  1026.         XOR    SI,SI        ;COPY FROM PSP
  1027.         XOR    DX,DX        ;PROMPT IS AT ROW ZERO
  1028.         MOV    CX,29        ;COPY ALL 40 CHARACTERS
  1029. ERASE_LOOP:
  1030.         CALL    READ_CHAR    ;GET CHARACTER ON THIS LINE
  1031.         MOV    CS:[DI],AL    ;PUT IN BACK IN MEMORY
  1032.         INC    DI
  1033.         MOV    AX,CS:[SI]    ;GET THE ORIGINAL CHARACTER BACK
  1034.         MOV    BL,AH        ;PUT ATTRIBUTE INTO BL
  1035.         INC    SI
  1036.         INC    SI
  1037.         CALL    DISPLAY_CHAR    ;WRITE ORIGINAL CHARACTER
  1038.         INC    DL        ;MOVE TO NEXT COLUMN
  1039.         LOOP    ERASE_LOOP    ;ERASE THE ENTIRE PROMPT
  1040.         POP    SI
  1041.         POP    DI
  1042.         RET
  1043. SNIPPER        ENDP
  1044.  
  1045. ;---------------------------------------------------------------------;
  1046. ; THIS COPIES THE BUFFER CONTENTS TO A FILE. IT SHOULD ONLY BE CALLED ;
  1047. ; WHEN DOS IS IN A STABLE AND REENTRANT CONDITION.                    ;
  1048. ;---------------------------------------------------------------------;
  1049. WRITE_TO_FILE    PROC    NEAR
  1050.         ASSUME    DS:NOTHING, ES:NOTHING
  1051.         MOV    WRIT_FILE,0    ;TURN OFF REQUEST FLAG
  1052.         PUSH    AX        ;MUST PRESERVE ALL REGISTERS
  1053.         PUSH    BX
  1054.         PUSH    CX
  1055.         PUSH    DX
  1056.         PUSH    DS
  1057.         PUSH    ES
  1058.         PUSH    CS
  1059.         POP    DS
  1060.         ASSUME    DS:CSEG        ;DS POINTS TO OUR CODE SEGMENT
  1061.              MOV    AX,3524H    ;GET DOS CRITICAL ERROR VECTOR
  1062.         INT    21H        ;DOS FUNCTION TO GET VECTOR
  1063.         PUSH    BX        ;SAVE OLD VECTOR ON STACK
  1064.         PUSH    ES
  1065. ; REPLACE THE DOS SEVERE ERROR INTERRUPT WITH OUR OWN ROUTINE.
  1066.         MOV    DX,OFFSET NEWINT24
  1067.         MOV    AX,2524H    ;SETUP TO CHANGE INT 24h VECTOR
  1068.         INT    21H        ;CHANGE DOS SEVERE ERROR VECTOR
  1069.         LEA    SI,PATH_N_FILE
  1070. PATH_N_FILE_LOOP:
  1071.         CMP    BYTE PTR[SI],0
  1072.         JE    PNFL_DONE
  1073.         MOV    BYTE PTR[SI],0
  1074.         INC    SI
  1075.         JMP    PATH_N_FILE_LOOP
  1076. PNFL_DONE:
  1077.         LEA    DI,PATH_N_FILE
  1078.         LEA    SI,FILE_PATH
  1079. TRANSFER_PATH_N_FILE:
  1080.         CMP    BYTE PTR[SI],0
  1081.         JE    TPNF_DONE
  1082.         PUSH    BX
  1083.         MOV    BL,[SI]
  1084.         MOV    [DI],BL
  1085.         POP    BX
  1086.         INC    SI
  1087.         INC    DI
  1088.         JMP     TRANSFER_PATH_N_FILE
  1089. TPNF_DONE:
  1090.         LEA    SI,FILENAME
  1091. ADD_FILENAME_LOOP:
  1092.         CMP    BYTE PTR[SI],0
  1093.         JE    AFL_DONE
  1094.         PUSH    BX
  1095.         MOV    BL,[SI]
  1096.         MOV    [DI],BL
  1097.         POP    BX
  1098.         INC    SI
  1099.         INC    DI
  1100.         JMP    ADD_FILENAME_LOOP
  1101. AFL_DONE:
  1102.         MOV    DX,OFFSET PATH_N_FILE    ;POINT TO FILENAME
  1103. ; FIRST TRY TO OPEN THE FILE.  IF DOS RETURNS WITH THE CARRY FLAG SET,
  1104. ; THE FILE DIDN'T EXIST AND WE MUST CREATE IT.  ONCE THE FILE IS OPENED,
  1105. ; ADVANCE THE FILE POINTER TO THE END OF FILE TO APPEND.
  1106.         MOV    AX,3D02H    ;DOS FUNCTION TO OPEN FILE
  1107.         INT    21H        ;DOS WILL RETURN WITH CARRY FLAG
  1108.         JC    FILE_NOT_FOUND    ;SET IF FILE DOESN'T EXIST.
  1109.         MOV    BX,AX        ;KEEP HANDLE IN BX ALSO
  1110.         XOR    CX,CX        ;MOVE DOS FILE POINTER TO THE
  1111.         XOR    DX,DX        ;END OF THE FILE. THIS LETS US
  1112.         MOV    AX,4202H    ;APPEND THIS TO AN EXISTING FILE
  1113.         INT    21H        ;DOS FUNCTION TO MOVE POINTER
  1114.         JNC    WRITE_FILE    ;IF NO ERROR, CONTINUE TO WRITE
  1115. DOS_ERROR:
  1116.         CMP    ERR_STAT,0    ;DID A SEVERE ERROR OCCUR?
  1117.         JNE    REP_VECTOR    ;IF SEVERE ERROR, JUST QUIT
  1118.         JMP    SHORT CLOSE_FILE;JUST CLOSE THE FILE
  1119.  
  1120. FILE_NOT_FOUND:    CMP    ERR_STAT,0    ;DID A SEVERE ERROR OCCUR?
  1121.         JNE    REP_VECTOR    ;IF SEVERE ERROR, JUST QUIT
  1122.         MOV    CX,0020H    ;ATTRIBUTE FOR NEW FILE
  1123.         MOV    AH,3CH        ;CREATE FILE FOR WRITING
  1124.         INT    21H        ;DOS FUNCTION TO CREATE FILE
  1125.         JC    DOS_ERROR       ;ON ANY ERROR, TAKE JUMP
  1126.         MOV    BX,AX        ;SAVE HANDLE IN BX
  1127. WRITE_FILE:     MOV    DX,BUFF_START    ;POINT TO BUFFER
  1128.         MOV    CX,BUFF_LAST    ;GET BUFFER POINTER
  1129.         SUB    CX,DX        ;NUMBER OF CHARS IN BUFFER
  1130.         MOV    AH,40H        ;DOS WRITE TO A DEVICE FUNCTION
  1131.         INT    21H        ;WRITE TO THE FILE
  1132. CLOSE_FILE:
  1133.         MOV    AH,3EH        ;DOS FUNCTION TO CLOSE THE FILE
  1134.         INT    21H
  1135. REP_VECTOR:
  1136.         POP    DS        ;GET INT 24H VECTOR FROM STACK
  1137.         POP    DX
  1138.         MOV    AX,2524H    ;RESTORE CRITICAL ERROR VECTOR
  1139.         INT    21H        ;DOS FUNCTION TO CHANGE VECTOR
  1140.         POP    ES        ;FINALLY RESTORE ALL REGISTERS
  1141.         POP    DS
  1142.         POP    DX
  1143.         POP    CX
  1144.         POP    BX
  1145.         POP    AX
  1146.         RET            ;FINISHED WRITING TO DISK
  1147. WRITE_TO_FILE    ENDP
  1148. ;---------------------------------------------------------------------;
  1149. ; INTERRUPT 09 ROUTINE.  WATCH FOR TRIGGER KEY TO POP UP.
  1150. ;---------------------------------------------------------------------;
  1151. NEWINT09    PROC    FAR
  1152.         ASSUME    DS:NOTHING, ES:NOTHING
  1153.         STI            ;ALLOW OTHER INTERRUPTS
  1154.         PUSH    AX        ;MUST SAVE PROCESSOR STATE
  1155.         IN    AL,60H        ;GET THE SCAN CODE
  1156.         CMP    AL,HOTKEY    ;IS IT THE HOT KEY?
  1157.         JE    TRIGGER        ;IF YES, CHECK THE MASK
  1158. INT09_EXIT:    POP    AX        ;RESTORE THE PROCESSOR STATE
  1159.         JMP    OLDINT09    ;CONTINUE WITH ROM ROUTINE
  1160.  
  1161. TRIGGER:    MOV    AH,2        ;GET KEYBOARD STATUS
  1162.         INT    16H        ;BIOS KEYBOARD SERVICE
  1163.  
  1164.         AND    AL,0FH        ;Take lower four bits
  1165.         CMP    AL,SHIFT_MASK    ;IS CTL KEY DOWN?
  1166.         JNZ    INT09_EXIT    ;IF NOT, IGNORE IT
  1167.         TEST    BUSY_FLAGS,00000100B ;IS SNIPPER ALREADY ACTIVE?
  1168.         JNZ    INT09_EXIT    ;IF ACTIVE, THEN EXIT
  1169.         OR    BUSY_FLAGS,00000100B ;ITS ACTIVE NOW
  1170.         PUSHF
  1171.         CALL    OLDINT09    ;LET ROM PROCESS THE KEY
  1172.         PUSH    BX        ;MUST PRESERVE ALL REGISTERS
  1173.         PUSH    CX
  1174.         PUSH    DX
  1175.         PUSH    BP
  1176.         PUSH    SI
  1177.         PUSH    DI
  1178.         PUSH    DS
  1179.         PUSH    ES
  1180.         PUSH    CS
  1181.         POP    DS        ;SET DS TO CSEG
  1182.         MOV    AX,BIOS_SEG    ;ES POINTS TO BIOS DATA AREA
  1183.         MOV    ES,AX
  1184.         ASSUME    DS:CSEG, ES:BIOS_SEG
  1185.         CALL    GET_CURS_ADDR    ;CURSOR ADDRESS FOR THIS PAGE
  1186.         PUSH    ES:[BX]        ;SAVE THE CURSOR LOCATION
  1187.         CALL    SNIPPER        ;DO THE WINDOW
  1188.         CALL    GET_CURS_ADDR    ;CURS0R ADDRESS FOR THIS PAGE
  1189.         POP    ES:[BX]        ;GET BACK CURSOR  POSITION
  1190.         AND    BUSY_FLAGS,11111011B  ;SNIPPER IS NOT ACTIVE
  1191.         POP    ES        ;RESTORE ALL REGISTERS
  1192.         POP    DS
  1193.         POP    DI
  1194.         POP    SI
  1195.         POP    BP
  1196.         POP    DX
  1197.         POP    CX
  1198.         POP    BX
  1199.         POP    AX
  1200.         IRET            ;NOW WERE ALL DONE
  1201. NEWINT09    ENDP
  1202. ;---------------------------------------------------------------------;
  1203. ; INTERRUPT 13 ROUTINE. SET BIOS BUST BIT                             ;
  1204. ;---------------------------------------------------------------------;
  1205. NEWINT13    PROC    FAR
  1206.         ASSUME    DS:NOTHING, ES:NOTHING
  1207.         OR    BUSY_FLAGS,00000010B    ;SET BIOS BUSY BIT
  1208.         PUSHF
  1209.         CALL    OLDINT13    ;DO THE BIOS FUNCTION
  1210.         PUSHF            ;SAVE RESULT FLAGS
  1211.         AND    BUSY_FLAGS,11111101B    ;CLEAR BIOS BUSY BIT
  1212.         POPF            ;GET BACK RESULT FLAGS
  1213.         STI            ;MUST RETURN WITH INTERUPTS ON
  1214.         RET    2        ;RETURN BIOS RESULT FLAGS
  1215. NEWINT13    ENDP
  1216. ;---------------------------------------------------------------------;
  1217. ; INTERRUPT 16 ROUTINE. INSERT KEYSTROKES FROM BUFFER                 ;
  1218. ;---------------------------------------------------------------------;
  1219. NEWINT16    PROC    FAR
  1220.         ASSUME    DS:NOTHING, ES:NOTHING
  1221.         PUSH    BX
  1222.         CMP    SEND_KEYS,1    ;SENDING KEYS FROM BUFFER?
  1223.         JE    INSERT_KEY    ;IF YES, THEN GET NEXT ONE
  1224.         CMP    FILE_SEND_KEYS,1    ;SENDING KEYS FROM BUFFER?
  1225.         JE    FILE_INSERT_KEY    ;IF YES, THEN GET NEXT ONE
  1226.         CMP    WRIT_FILE,1    ;ANYTHING TO WRITE TO DISK?
  1227.         JE    CHECK_DOS_STAT    ;IF YES, THIS IS THE TIME
  1228. BIOS_KB:
  1229.         POP    BX
  1230.         JMP    OLDINT16    ;JUST DO NORMAL KB ROUTINE
  1231. CHECK_DOS_STAT:
  1232.         CMP    DOS_STAT,0AH    ;DOING READ STRING?
  1233.         JE    BEGIN_NOW    ;IF YES, ITS SAFE TO BEGIN
  1234.         CMP    DOS_STAT,8    ;DOING KEYBOARD INPUT?
  1235.         JNE    BIOS_KB        ;IF YES, ITS SAFE TO BEGIN
  1236. BEGIN_NOW:
  1237.         STI            ;GET INTERRUPTS BACK ON
  1238.         CALL    WRITE_TO_FILE    ;EMPTY THE BUFFER
  1239.         JMP    BIOS_KB        ;CONTINUE WITH BIOS ROUTINE
  1240. INSERT_KEY:
  1241.         STI            ;INTERRUPTS BACK ON
  1242.         MOV    BX,BUFF_NEXT    ;GET ADDRESS OF NEXT BYTE
  1243.         CMP    BX,BUFF_LAST    ;AT END OF BUFFER YET?
  1244.         JL    GET_A_KEY    ;IF NOT, GET THE NEXT ONE
  1245.         MOV    SEND_KEYS,0    ;WHEN DONE, TURN OFF SEND SWITCH
  1246. GET_A_KEY:
  1247.         MOV    AL,CS:[BX]    ;GET THE NEXT KEY CODE
  1248.         CMP    AL,10        ;IS IT A LINE FEED?
  1249.         JNE    NOT_LF        ;DONT RETURN THE LINE FEEDS
  1250.         INC    BUFF_NEXT    ;SKIP TO NEXT KEY
  1251.         JMP    INSERT_KEY
  1252. NOT_LF:
  1253.         CMP    AH,1        ;REQUEST FOR STATUS ONLY?
  1254.         JE    RETURN_STATUS    ;IF YES, RETURN STATUS ONLY
  1255.         CMP    AH,0        ;REQUEST TO GET THE NEXT KEY
  1256.         JNE    BIOS_KB        ;IF NOT, IGNORE THIS FUNCTION
  1257.         INC    BX        ;REMOVE THIS KEY FROM OUR BUFFER
  1258.         MOV    BUFF_NEXT,BX    ;SAVE THE POINTER TO NEXT KEY
  1259. RETURN_STATUS:
  1260.         OR    BL,1        ;CLEAR ZERO FLAG TO INDICATE A
  1261.         POP    BX        ;KEY IS AVAILIABLE
  1262.         RET    2        ;RETURN WITH THESE FLAGS
  1263. FILE_INSERT_KEY:
  1264.         STI            ;INTERRUPTS BACK ON
  1265.         MOV    BX,FILE_BUFF_NEXT    ;GET ADDRESS OF NEXT BYTE
  1266.         CMP    BX,FILE_BUFF_LAST    ;AT END OF BUFFER YET?
  1267.         JL    FILE_GET_A_KEY    ;IF NOT, GET THE NEXT ONE
  1268.         MOV    FILE_SEND_KEYS,0    ;WHEN DONE, TURN OFF SEND SWITCH
  1269. FILE_GET_A_KEY:
  1270.         MOV    AL,CS:[BX]    ;GET THE NEXT KEY CODE
  1271.         CMP    AL,10        ;IS IT A LINE FEED?
  1272.         JNE    FILE_NOT_LF        ;DONT RETURN THE LINE FEEDS
  1273.         INC    FILE_BUFF_NEXT    ;SKIP TO NEXT KEY
  1274.         JMP    FILE_INSERT_KEY
  1275. FILE_NOT_LF:
  1276.         CMP    AH,1        ;REQUEST FOR STATUS ONLY?
  1277.         JE    FILE_RETURN_STATUS    ;IF YES, RETURN STATUS ONLY
  1278.         CMP    AH,0        ;REQUEST TO GET THE NEXT KEY
  1279.         JNE    BIOS_KB        ;IF NOT, IGNORE THIS FUNCTION
  1280.         INC    BX        ;REMOVE THIS KEY FROM OUR BUFFER
  1281.         MOV    FILE_BUFF_NEXT,BX    ;SAVE THE POINTER TO NEXT KEY
  1282. FILE_RETURN_STATUS:
  1283.         OR    BL,1        ;CLEAR ZERO FLAG TO INDICATE A
  1284.         POP    BX        ;KEY IS AVAILIABLE
  1285.         RET    2        ;RETURN WITH THESE FLAGS
  1286. NEWINT16    ENDP
  1287. ;---------------------------------------------------------------------;
  1288. ; INTERRUPT 21 ROUTINE.  THIS ROUTINE IS USED TO MONITOR DOS FUNCTION ;
  1289. ; CALLS. IF THE BUFFER NEEDS TO BE FLUSHED, IT WIL BE DONE HERE.      ;
  1290. ;---------------------------------------------------------------------;
  1291. NEWINT21    PROC    FAR
  1292.         ASSUME    DS:NOTHING, ES:NOTHING
  1293.         STI
  1294.         OR    AH,AH        ;DOING FUNCTION ZERO?
  1295.         JNE    NOT_ZERO
  1296.         MOV    AH,4CH        ;IF YES, CHANGE IT TO A 4CH
  1297. NOT_ZERO:
  1298.         OR    BUSY_FLAGS,00000001B    ;SET DOS BUSY BIT
  1299.         MOV    DOS_STAT,AH
  1300.         PUSHF            ;SIMULATE AN INTERRUPT
  1301.         CALL    OLDINT21    ;DO THE DOS FUNCTION
  1302.         PUSHF            ;SAVE THE RESULT FLAGS
  1303.         AND    BUSY_FLAGS,11111110B    ;CLEAR DOS BUSY BIT
  1304.         CMP    WRIT_FILE,1    ;ANYTHING TO WRITE TO DISK?
  1305.         JNE    NO_WRITE    ;IF NOT JUST RETURN
  1306.         CALL    WRITE_TO_FILE    ;SAFE TO ACCESS DISK NOW
  1307. NO_WRITE:
  1308.         POPF            ;RECOVER DOS RESULT FLAGS
  1309.         RET    2        ;RETURN WITH DOS RESULT FLAGS
  1310. NEWINT21    ENDP
  1311. ;---------------------------------------------------------------------;
  1312. ; NEW INTERRUPT 24H (CRITICAL DOS ERROR).  THIS INTERRUPT IS ONLY IN  ;
  1313. ; EFFECT ONLY DURING A WRITE SCREEN.  IT IS REQUIRED TO SUPPRESS THE  ;
  1314. ; 'ABORT, RETRY, IGNORE' MESSAGE.  ALL FATAL DISK ERRORS ARE IGNORED. ;
  1315. ;---------------------------------------------------------------------;
  1316. NEWINT24    PROC    FAR
  1317.         ASSUME    CS:CSEG, DS:NOTHING, ES:NOTHING
  1318.         STI            ;TURN INTERRUPTS BACK ON
  1319.         INC     ERR_STAT    ;SET THE ERROR FLAG
  1320.          XOR    AL,AL        ;TELLS DOS TO IGNORE THE ERROR
  1321.         IRET            ;THATS ALL WE DO HERE
  1322. NEWINT24    ENDP
  1323.  
  1324. ;--------------------------------------------------------------------;
  1325. ; HERE IS THE CODE USED TO INITIALIZE SNIPPER.                       ;
  1326. ;--------------------------------------------------------------------;
  1327.         ASSUME    CS:CSEG, DS:CSEG, ES:CSEG
  1328. INITIALIZE:
  1329.         LEA    DX,COPYRIGHT
  1330.         MOV    AH,9        ;DOS DISPLAY STRING SERVICE
  1331.         INT    21H        ;DISPLAY TITLE MESSAGE
  1332. ; SEARCH FOR AN PREVIOUSLY INSTALLED COPY OF SNIPPER
  1333.         NOT    BYTE PTR START    ;MODIFY TO AVOID FASLE MATCH
  1334.         XOR    BX,BX        ;START SEARCH AT SEGMENT ZERO
  1335.         MOV    AX,CS        ;COMPARE TO THIS CODE SEGMENT
  1336. NEXT_SEGMENT:
  1337.         INC    BX        ;LOOK AT NEXT SEGMENT
  1338.         CMP    AX,BX        ;UNTIL REACHING THIS CODE SEG
  1339.         MOV    ES,BX
  1340.         JE    NOT_INSTALLED
  1341.         LEA    SI,START    ;SETUP TO COMPARE STRINGS
  1342.         MOV    DI,SI
  1343.         MOV    CX,16        ;16 BYTES MUST MATCH
  1344.         REP    CMPSB        ;COMPARE DS:SI TO ES:DI
  1345.         OR    CX,CX        ;DID THE STRINGS MATCH?
  1346.         JNE    NEXT_SEGMENT    ;IF NO MATCH, TRY NEXT SEGMENT
  1347.         LEA    DX,INSTALLED_MSG
  1348.         JMP    SHORT ERR_EXIT
  1349. NOT_INSTALLED:
  1350.         MOV    AH,30H
  1351.         INT    21H        ;GET DOS VERSION NUMBER
  1352.         CMP    AL,2        ;IS IT HIGHER THAN 2.0?
  1353.         JNB    VER_OK        ;IF YES, PROCEED
  1354.         LEA    DX,BAD_DOS_MSG
  1355. ERR_EXIT:    
  1356.         MOV    AH,9        ;DOS DISPLAY STRING SERVICE
  1357.         INT    21H        ;DISPLAY ERRER MESSAGE
  1358.         RET            ;RETURN TO DOS
  1359. EXIT_NON_TSR:
  1360.         MOV    AH,4CH
  1361.         INT    21H
  1362. VER_OK:
  1363.         INC    SI        ;POINT TO FIRST PARAMETER
  1364.         MOV    SI,81H        ;POINT TO PARAMETER AREA
  1365.         CALL    GET_PARAM    ;GET FIRST PARAMETER (ROWS)
  1366.         PUSH    AX        ;SAVE THE ROW COUNT
  1367.         CALL    GET_PARAM    ;GET SECOND PARAMETER (COLUMNS)
  1368.         ADD    AX,2        ;ADD SPACE FOR CR AND LF
  1369.         POP    BX        ;GET BACK FIRST PARAMETER
  1370.         MUL    BX        ;PRODUCT OF ROWS AND COLUMNS
  1371.         OR    AX,AX        ;WAS ANYTHING ENTERED?
  1372.         JE    NO_PARAMS    ;IF NOT, USE DEFAULT VALUE
  1373.         CMP    AX,10000    ;MAXIMUM BUFFER IS 10000 BYTES
  1374.         JLE    SIZE_IS_OK
  1375.         MOV    AX,10000
  1376. SIZE_IS_OK:
  1377.         ADD    AX,BUFF_START
  1378.         MOV    BUFF_END,AX    ;SET THE NEW BUFFER SIZE
  1379. NO_PARAMS:
  1380.         MOV    AX,BIOS_SEG    ;LOOK AT BIOS DATA AREA
  1381.         MOV    ES,AX
  1382.         ASSUME    ES:BIOS_SEG
  1383.         CMP    ROWS,0        ;IS NUMBER OF ROWS ENTERED HERE
  1384.         JNE    MUST_BE_EGA    ;IF YES, AN EGA MAY BE PRESENT
  1385.         MOV    ROWS,24        ;IF NOT EGA, MUST BE 24 ROWS
  1386. MUST_BE_EGA:
  1387.         ASSUME    ES:NOTHING
  1388.                MOV    AX,3509H    ;GET KEYBOARD BREAK VECTOR
  1389.         INT    21H
  1390.         MOV    WORD PTR [OLDINT09],  BX  ;SAVE SEGMENT
  1391.         MOV    WORD PTR [OLDINT09+2],ES  ;SAVE OFFSET
  1392.         MOV    DX, OFFSET NEWINT09
  1393.         MOV    AX, 2509H
  1394.         INT    21H        ;DOS FUNCTION TO CHANGE VECTOR
  1395.                MOV    AX,3513H    ;GET BIOS DISK INTERRUPT VECTOR
  1396.         INT    21H
  1397.         MOV    WORD PTR [OLDINT13],  BX  ;SAVE SEGMENT
  1398.         MOV    WORD PTR [OLDINT13+2],ES  ;SAVE OFFSET
  1399.         MOV    DX, OFFSET NEWINT13
  1400.         MOV    AX, 2513H
  1401.         INT    21H        ;DOS FUNCTION TO CHANGE VECTOR
  1402.                MOV    AX,3516H    ;GET KEYBOARD INPUT VECTOR
  1403.         INT    21H
  1404.         MOV    WORD PTR [OLDINT16],  BX  ;SAVE SEGMENT
  1405.         MOV    WORD PTR [OLDINT16+2],ES  ;SAVE OFFSET
  1406.         MOV    DX, OFFSET NEWINT16
  1407.         MOV    AX, 2516H
  1408.         INT    21H        ;DOS FUNCTION TO CHANGE VECTOR
  1409.                MOV    AX,3521H    ;GET DOS FUNCTION VECTOR
  1410.         INT    21H
  1411.         MOV    WORD PTR [OLDINT21],  BX
  1412.         MOV    WORD PTR [OLDINT21+2],ES
  1413.         MOV    DX, OFFSET NEWINT21
  1414.         MOV    AX, 2521H
  1415.         INT    21H        ;DOS FUNCTION TO CHANGE VECTOR
  1416.         CALL    GET_PARAM
  1417. ;--------------------------------------------------------------------;
  1418. ; DEALLOCATE OUR COPY OF THE ENVIORNMENT.                            ;
  1419. ; EXIT USING INT 27H. LEAVE CODE AND SPACE FOR BUFFER RESIDENT.      ;
  1420. ;--------------------------------------------------------------------;
  1421.         MOV    AX,DS:[002CH]    ;GET SEGMENT OF ENVIORNMENT
  1422.         MOV    ES,AX        ;PUT IT INTO ES
  1423.         MOV    AH,49H        ;RELEASE ALLOCATED MEMORY
  1424.         INT    21H
  1425.         MOV    DX,FILE_BUFF_END;LEAVE THIS MUCH RESIDENT
  1426.         INT    27H        ;TEMINATE AND STAY RESIDENT
  1427. ;---------------------------------------------------------;
  1428. ; GET_PARAM RETRIEVES AN INTEGER FROM THE COMMAND LINE.   ;
  1429. ;---------------------------------------------------------;
  1430. GET_PARAM:    
  1431.         XOR    AX,AX        ;CLEAR AX FOR TOTAL
  1432. GET_DIGIT:    
  1433.         MOV    BL,[SI]        ;GET CHARACTER INTO BL
  1434.         CMP    BL,0DH        ;IS IT THE LAST ONE?
  1435.         JE    DONE
  1436.         INC    SI        ;POINT TO NEXT CHARACTER
  1437.         CMP    BL,","        ;IS IT THE DELIMITER?
  1438.         JE    DONE
  1439.         CMP    BL,"/"        ;IS IT THE DELIMITER?
  1440.         JE    GET_THE_PATH
  1441.         SUB    BL,30H        ;CONVERT ASCII TO INTEGER
  1442.         JB    GET_DIGIT    ;IS IT A VALID DIGIT
  1443.         CMP    BL,9
  1444.         JA    GET_DIGIT    ;IF NOT VALID, JUST SKIP IT
  1445.         MOV    BH,10        ;TIMES 10 FOR NEXT DIGIT
  1446.         MUL    BH        ;MULTIPLY SUM AND ADD THIS DIGIT
  1447.         ADD    AL,BL        ;ADD DIGIT TO SUM
  1448.         JMP    GET_DIGIT    ;READ ALL CHARACTERS ON LINE
  1449. GET_THE_PATH:
  1450.         MOV    BL,[SI]
  1451.         CMP    BL,50H
  1452.         JE    PATH_FLAG_OK
  1453.         CMP    BL,70H
  1454.         JNE    DONE
  1455. PATH_FLAG_OK:
  1456.         INC    SI
  1457.         MOV    BL,[SI]
  1458.         CMP    BL,3DH
  1459.         JNE    DONE
  1460.         INC    SI
  1461.         LEA    DI,FILE_PATH
  1462. GET_THE_PATH_LOOP:
  1463.         MOV    BL,[SI]
  1464.         CMP    BL,0DH
  1465.         JE    PATH_DONE
  1466.         MOV    [DI],BL
  1467.         INC    SI
  1468.         INC    DI
  1469.         JMP    GET_THE_PATH_LOOP
  1470. PATH_DONE:
  1471.         MOV    BYTE PTR[DI],5CH
  1472. DONE:        
  1473.         RET
  1474. CSEG        ENDS
  1475.         END    START
  1476.